﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Aga.Psad.Mvc.WDigDepFiel;
using Aga.Psad.Backend.Entities;
using System.Net;
using System.Security.Cryptography.X509Certificates;
using Aga.Psad.Mvc.Models;
using Aga.Psad.Common;

namespace Aga.Psad.Mvc.Helpers
{
    public class WDigDepFielHelper
    {
        private HttpServerUtilityBase Server { get; set; }

        private WDigDepFielHelper() { }

        public WDigDepFielHelper(HttpServerUtilityBase server)
        {
            this.Server = server;
        }


        internal Recibo EnviarAviso(Aviso aviso)
        {
            using (var service = new WDigDepFiel.wDigDepFiel())
            {
                TicketAccesoHelper helper = new TicketAccesoHelper(this.Server, aviso.TipoAgente, aviso.CuitAgente);
                Autenticacion autentica = helper.GetAutentication();

                string nroLegajo = aviso.Legajo;
                string cuitDeclarante = aviso.CuitDeclarante;
                string cuitPsad = aviso.CuitPsad;
                string cuitIE = aviso.CuitIE;
                string codigo = aviso.Codigo;
                DateTime fechaHoraAcept = aviso.FechaHoraAcept;
                string ticket = aviso.Ticket;

                ServicePointManager.ServerCertificateValidationCallback +=
                    new System.Net.Security.RemoteCertificateValidationCallback(customXertificateValidation);

                Recibo recibo = service.AvisoRecepAcept(
                    autentica,
                    nroLegajo,
                    cuitDeclarante,
                    cuitPsad,
                    cuitIE,
                    codigo,
                    fechaHoraAcept,
                    ticket);

                return recibo;
            }
        }

        private static bool customXertificateValidation(object sender, X509Certificate cert, X509Chain chain, System.Net.Security.SslPolicyErrors error)
        {
            string subject = "C=AR, L=Ciudad Autonoma de Buenos Aires, O=Administracion Federal de Ingresos Publicos, OU=Subdireccion General de Sistemas y Telecomunicaciones, CN=testdia.afip.gov.ar";
            if (cert.Subject == subject)
            {
                return true;
            }

            return false;
        }

        internal Recibo EnviarAvisoDigitaliizacion(AvisoViewModel aviso)
        {
            using (wDigDepFiel service = new wDigDepFiel())
            {
                TicketAccesoHelper helper = new TicketAccesoHelper(this.Server, aviso.TipoAgente, aviso.CuitAgente);
                Autenticacion autentica = helper.GetAutentication();

                string nroLegajo = aviso.Legajo;
                string cuitDeclarante = aviso.CuitDeclarante;
                string cuitPsad = aviso.CuitPsad;
                string cuitIE = aviso.CuitIE;
                string codigo = aviso.Codigo;
                string cuitAta = string.Empty;
                DateTime fechaHoraAcept = aviso.FechaHoraAcept;
                string ticket = aviso.Ticket;
                string serviceUrl = Config.PsadServiceUrl;
                string hashing = aviso.Hash;

                //calculo las familias
                var familias = from a in aviso.Archivos
                               group a by a.Familia into g
                               select new Familia { codigo = g.Key, cantidad = g.Count() };

                int total = familias.Sum(f => f.cantidad);

                ServicePointManager.ServerCertificateValidationCallback +=
                    new System.Net.Security.RemoteCertificateValidationCallback(customXertificateValidation);

                Recibo recibo = service.AvisoDigit(
                    autentica,
                    nroLegajo,
                    cuitDeclarante,
                    cuitPsad,
                    cuitIE,
                    cuitAta,
                    codigo,
                    serviceUrl,
                    familias.ToArray(),
                    ticket,
                    hashing,
                    total);

                return recibo;
            }
        }
    }
}
